package cn.zhuama.common.controller;

import cn.zhuama.basic.util.*;
import cn.zhuama.common.service.BindphoneService;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/common")
public class FileEditCommonController {

    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate redisTemplate;

    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private BindphoneService bindphoneService;

    @PostMapping("/logoUpload")
    public String upload(@RequestPart(required = true,value = "file") MultipartFile file) throws Exception {
        byte[] bytes = file.getBytes();
        String originalFilename = file.getOriginalFilename();//全名11.jpeg
        String extension = FilenameUtils.getExtension(originalFilename);//后缀 jpeg
        String upload = FastDfsUtils.upload(bytes, extension);
        return upload;
    }

    @PostMapping("/pdtp")
    public AjaxResult pdtp(@RequestParam String url) throws Exception {
        String newupload="http:/39.105.218.224"+url;
        if(!BaiduAuditUtils.ImgCensor(newupload)){
            return AjaxResult.me().setMessage("图片审核通过");
        }else{
            return del(url).setSuccess(false).setMessage("图片未通过 请重新选择");
            //return AjaxResult.me().setSuccess(false).setMessage("图片未通过 请重新选择");
        }
    }

    @PostMapping("/sms/{email}")
    public AjaxResult sms(@PathVariable String email) throws Exception {
        //创建复杂邮件对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //发送复杂邮件的工具类
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");
        helper.setFrom("273520113@qq.com");
        String code = StrUtils.getRandomString(6);
        redisTemplate.opsForValue().set("yzm",code,5,TimeUnit.MINUTES);
        helper.setSubject("宠物之家验证码获取");
        helper.setText("你的验证码为："+code,true);
        //收件人
        helper.setTo(email);
        javaMailSender.send(mimeMessage);
        return AjaxResult.me();
    }

    @PostMapping("/smsPhone")
    public AjaxResult smsPhone(@RequestBody Map<String,Object> param) throws Exception {
            //1.参数检验 判断传进来的参数是否为空
            //2.逻辑判断 判断图片验证码是否正确
            //3.业务实现
            //这个获取当前 输入时间
       // String co = (String) redisTemplate.opsForValue().get(param.get("imageCodeKey"));
        Long sendtime = System.currentTimeMillis();
            //用map存 算了 直接用redis试试
//            Map<String,Object> map1=new HashMap<>();
//            map1.put("register",param.get("phone"));
//            map1.put(senddate,redisTemplate.opsForValue().get(param.get("imageCodeKey")));
              //redisTemplate.opsForValue().set("register",param.get("phone"));
            if(param.get("phone")==null||param.get("imageCode")==null||param.get("imageCodeKey")==null){
                return AjaxResult.me().setSuccess(false).setMessage("请正确输入信息获取(信息不能为空)");
            }
            //这步 用前端key对应的value作为存在redis中的key取出的value 和 前端输入的作对比
            if(param.get("imageCode").equals(redisTemplate.opsForValue().get(param.get("imageCodeKey")))){
                if(redisTemplate.opsForValue().get(param.get("phone"))==null){
                    String randomCode = StrUtils.getRandomString(4);//验证码
                    redisTemplate.opsForValue().set(param.get("phone"),sendtime,3,TimeUnit.MINUTES);
                    redisTemplate.opsForValue().set("randomCode",randomCode,3,TimeUnit.MINUTES);
                    SmsUtils.sendSms((String)param.get("phone"),randomCode);
                    System.out.println(randomCode);
                    return AjaxResult.me().setMessage("发送成功");
                }
                //验证码判定完之后 判断时间 1分钟之内不可重发
                //timede 作为时间差
                Long timede = (sendtime-(Long) redisTemplate.opsForValue().get(param.get("phone")))/1000;
                //使用redis这个方法看它的剩余存活时间进行判断呢
                Long redistime = redisTemplate.getExpire(param.get("phone"));
                if(timede<60){
                    //小于一分钟的话 不会重新发送 返回信息 发送时间间隔过短
                    return AjaxResult.me().setSuccess(false).setMessage("发送时间间隔过短");
                }
                if(timede>60&&timede<180){
                   //大于1分钟 小于三分钟 可以重发 但是验证码不变 这边验证码我用随机数
                    SmsUtils.sendSms((String)param.get("phone"), (String) redisTemplate.opsForValue().get("randomCode"));
                    System.out.println(redisTemplate.opsForValue().get("randomCode"));
                    return AjaxResult.me().setMessage("发送成功");
                }
                //超过3分钟 重新生成验证码 其实也不用写 因为那个redis里面时间到了直接为空了就会重新生成
                //我觉得这个代码是可以被优化的就像 有了redis存活周期进行判定 就不需要时间差来作为判断依据
//                if(redistime<1){//这个应该是 显示的秒数
//                    //小于一分钟的话 不会重新发送 返回信息 发送时间间隔过短
//                    return AjaxResult.me().setSuccess(false).setMessage("发送时间间隔过短");
//                }
//                if(redistime>1&&redistime<3){
//                    //大于1分钟 小于三分钟 可以重发 但是验证码不变 这边验证码我用随机数
//                    cn.itsource.basic.util.SmsUtils.sendSms((String)param.get(param.get("phone")), (String) redisTemplate.opsForValue().get(param.get("phoneCode")));
//                    return AjaxResult.me().setMessage("发送成功");;
//                }
            }else {
                return AjaxResult.me().setSuccess(false).setMessage("验证码输入错误");
            }
        return AjaxResult.me().setSuccess(false).setMessage("消息发送失败");

    }



    @DeleteMapping("/deleteload")
    public AjaxResult del(@RequestParam String path) throws IOException {
        if(path==null){
            return AjaxResult.me().setSuccess(false).setMessage("未获取到图片路径");
        }else {
            // 解析 FastDFS 文件路径
            String[] parts = path.split("/", 2); // 将路径拆分为 groupName 和 fileName
            String groupName = parts[0]; // 组名
            String fileName = parts[1];  // 文件名
            String[] parts1 = fileName.split("/", 2);
            FastDfsUtils.delete(parts1[0],parts1[1]);
            System.out.println("判断删除成功否");
            return AjaxResult.me();
        }
    }

    @GetMapping("/img/{key}")
    public String img(@PathVariable("key") String key)  {
        //根据工具包获取随机验证码
        String code = VerifyCodeUtils.generateVerifyCode(4);
        //用stringUtil获取随机
        String code1 = StrUtils.getComplexRandomString(4);
        //将验证码存放到Redis，设置x分钟过期
        redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);
        //返回发送给前端
        return VerifyCodeUtils.verifyCode(115,40,code);
    };

}
